﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using ForrajeriaBCL;
using ForrajeriaDB;

namespace ForrajeriaFRONT.ABM
{
    public partial class Usuarios : System.Web.UI.Page
    {
        private UsuarioBCL objBC;
        private UsuarioMO objEditar;
        ClienteMO objCliEditar;
        EmpleadoMO objEmpEditar;
        
        public Usuarios() //constructor
        {
            objBC = new UsuarioBCL();

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            ((Label)this.Master.FindControl("lblTitulo")).Text = "Usuarios";

            if (!Page.IsPostBack)
            {
                
                TipoDocumentoBCL objDoc = new TipoDocumentoBCL();
                List<TipoDocumentoMO> listaDoc = new List<TipoDocumentoMO>();
                listaDoc = objDoc.GetAll();
                ddlTipoDoc.Items.Add(new ListItem("", "0"));
                foreach (TipoDocumentoMO aux in listaDoc)
                {
                    ddlTipoDoc.Items.Add(new ListItem(aux.TipoDocumento1, aux.Codigo.ToString()));

                }
                ddlTipoDoc.DataBind();
                
                if (!Context.User.IsInRole("ADMIN"))//si no es Administrador
                {
                    lblseleccione.Visible = false;
                    
                    rbEmpleado.Visible = false;
                    rbCliente.Visible = false;
                   
                    reqNombre.Text = "Debe Seleccionar un Cliente";
                    
                    chkAdmin.Visible = false;
                    chkStock.Visible = false;
                    chkVentas.Visible = false;
                    lbldatosCliEmp.Text = "Datos Cliente";
                }

                cargaPanelBusqueda();
                cargarLista();

                
            }
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            
            PanelCliente.Visible = true;

            if (!Context.User.IsInRole("ADMIN"))
            {//El empleado puede registrar usuarios de tipo Cliente
                //CleanControl(this.Controls);
                cargarListaCliente();

                chkAdmin.Enabled = false;
                chkAdmin.Checked = false;
                chkStock.Checked = false;
                chkVentas.Checked = false;
                chkVentas.Enabled = false;
                chkStock.Enabled = false;
            }
            else 
            {//El administrador puede registrar todo tipo de Usuarios
                if (rbCliente.Checked)
                {
                    //CleanControl(this.Controls);
                    cargarListaCliente();
                    chkAdmin.Enabled = false;
                    chkAdmin.Checked = false;
                    chkStock.Checked = false;
                    chkVentas.Checked = false;
                    chkVentas.Enabled = false;
                    chkStock.Enabled = false;
                }
                else
                {
                   // CleanControl(this.Controls);
                    cargarListaEmpleado();
                }
            }
            
        }


        private void cargaPanelCarga()
        {
            panelBusca.Visible = false;
            panelCarga.Visible = true;

        }
        private void cargaPanelBusqueda()
        {
            panelBusca.Visible = true;
            panelCarga.Visible = false;
        }

       

        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            objBC = new UsuarioBCL();
            if (objBC.ComprobarDisponibilidad(txtUsuario.Text) != null)
            {
                args.IsValid = false;
            }
            else
            {
                args.IsValid = true;
            }

        }

        

        private void cargarLista()
        {
            gridDatos.DataSource = null;
            objBC = new UsuarioBCL();

            List<UsuarioMO> lista = objBC.getALL();

            gridDatos.DataSource = lista;
            gridDatos.DataBind();

            modoVentana("nuevo"); ;
        }

       
        protected void gridDatos_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int index = e.NewSelectedIndex;
            
            cargaPanelCarga();

            if (gridDatos.Rows[index].Cells[1].Text==("CLIENTE"))
            {
                ////Es un CLIENTE
                

                ClienteBCL objCli = new ClienteBCL();
                objCliEditar = objCli.getByID(int.Parse(gridDatos.DataKeys[index].Values["CodigoCliente"].ToString()));
                
                panelCarga.Visible = true;
                txtNombre.Text = objCliEditar.NombreCliente;
                txtApellido.Text = objCliEditar.ApellidoCliente;
                ddlTipoDoc.SelectedValue =objCliEditar.TipoDocumento.ToString();
                txtNroDoc.Text = objCliEditar.NumeroDocumento.ToString();
                txtTelefono.Text = objCliEditar.Telefono;
                rbCliente.Checked = true;
                txtUsuario.Text = gridDatos.Rows[index].Cells[0].Text;

              
              
                ControlState(this.Controls, false);
                btnReset.Visible = true;
                btnReset.Enabled = true;
                btnVolver.Enabled = true;
                
            }
            else 
            {
                ////Es un Empleado

                //mensaje.Text = "Empleado";
                //mensaje.Visible = true;
                
                EmpleadoBCL objEmp = new EmpleadoBCL();
                objEmpEditar = objEmp.getByID(int.Parse(gridDatos.DataKeys[index].Values["CodigoEmpleado"].ToString()));
                
                panelCarga.Visible = true;
                txtNombre.Text = objEmpEditar.Nombre;
                txtApellido.Text = objEmpEditar.Apellido;
                ddlTipoDoc.SelectedValue = objEmpEditar.TipoDocumento.ToString();
                txtNroDoc.Text = objEmpEditar.NroDocumento.ToString();
                txtTelefono.Text = objEmpEditar.Telefono;
               rbEmpleado.Checked = true;
                txtUsuario.Text = gridDatos.Rows[index].Cells[0].Text;


                btnBuscar.Visible = false;


                ControlState(this.Controls, false);
                
                btnReset.Visible = true;
                btnReset.Enabled = true;
                btnVolver.Enabled = true;
            }
            mensaje.Visible = false;
            lblMensaje.Visible = false;
        }

        protected void gridDatos_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            
            objBC = new UsuarioBCL();
            try
            {
                if(gridDatos.Rows[e.RowIndex].Cells[1].Text=="CLIENTE")
                {
                    int cod=Int32.Parse(gridDatos.DataKeys[e.RowIndex].Values["CodigoUsuario"].ToString());
                    objBC.Eliminar(cod,"cliente");

                }
                else
                {
                    int cod = Int32.Parse(gridDatos.DataKeys[e.RowIndex].Values["CodigoUsuario"].ToString());
                    objBC.Eliminar(cod, "empleado");
                }
                mensaje.Text = "Eliminado Correctamente";
                mensaje.Visible = true;
                mensaje.ForeColor = System.Drawing.Color.Blue;


            }
            catch
            {
                mensaje.Text = "Error de Escritura en Base de Datos";
                mensaje.Visible = true;
                mensaje.ForeColor = System.Drawing.Color.Red;

            }
            cargarLista();
            cargaPanelBusqueda();
        }


        protected void modoVentana(string modo)
        {
            switch (modo)
            {
                case "nuevo":
                    CleanControl(this.Controls);
                    ControlState(this.Controls, true);
                    mensaje.Visible = false;
                    break;
                case "busqueda":
                    CleanControl(this.Controls);
                    ControlState(this.Controls, false);
                    mensaje.Visible = false;
                    break;
                case "edicion":
                    ControlState(this.Controls, true);
                    mensaje.Visible = false;
                    break;

                case "bloqueado":
                    CleanControl(this.Controls);
                    ControlState(this.Controls, false);
                    break;
            }
        }

        public void CleanControl(ControlCollection controles)
        {
            foreach (Control control in controles)
            {
                if (control is TextBox)
                    ((TextBox)control).Text = string.Empty;
                else if (control is DropDownList)
                    ((DropDownList)control).ClearSelection();
                else if (control is RadioButtonList)
                    ((RadioButtonList)control).ClearSelection();
                else if (control is CheckBoxList)
                    ((CheckBoxList)control).ClearSelection();
                else if (control is RadioButton)
                    ((RadioButton)control).Checked = false;
                else if (control is CheckBox)
                    ((CheckBox)control).Checked = false;
                else if (control.HasControls())
                    CleanControl(control.Controls);
            }
        }

        public void ControlState(ControlCollection controles, Boolean estado)
        {
            foreach (Control control in controles)
            {
                if (control is TextBox)
                    ((TextBox)control).Enabled = estado;
                else if (control is DropDownList)
                    ((DropDownList)control).Enabled = estado;
                else if (control is RadioButtonList)
                    ((RadioButtonList)control).Enabled = estado;
                else if (control is CheckBoxList)
                    ((CheckBoxList)control).Enabled = estado;
                else if (control is RadioButton)
                    ((RadioButton)control).Enabled = estado;
                else if (control is CheckBox)
                    ((CheckBox)control).Enabled = estado;
                else if (control.HasControls())
                    ControlState(control.Controls, estado);
            }
        }

        
        

        private void cargarListaCliente()
        {
            objBC = new UsuarioBCL();
            List<ClienteMO> lista = objBC.getCliBusquedaRegistrar();

            gvClientes.DataSource = null;
            gvClientes.DataSource = lista;
            gvClientes.DataBind();
            gvClientes.Visible = true;
            gvEmpleados.Visible = false;
        }

        private void cargarListaEmpleado()
        {
            objBC = new UsuarioBCL();
            List<EmpleadoMO> lista = objBC.getEmpBusqueda();

            gvEmpleados.DataSource = null;
            gvEmpleados.DataSource = lista;
            gvEmpleados.DataBind();
            gvEmpleados.Visible = true;
            gvClientes.Visible = false;
        }


        protected void guardarCliente(UsuarioMO objUser)
        {
            objBC = new UsuarioBCL();
            try
            {
                objBC.Adicionar(objUser, "cliente");
                modoVentana("nuevo");

                lblMensaje.Text = "Guardado Correctamente";
                lblMensaje.Visible = true;
                lblMensaje.ForeColor = System.Drawing.Color.Blue;

            }
            catch
            {
                lblMensaje.Text = "Error de Escritura en Base de Datos";
                lblMensaje.Visible = true;
                lblMensaje.ForeColor = System.Drawing.Color.Red;

            }
        }

        protected void guardarEmpleado(UsuarioMO objUser)
        {
            objBC = new UsuarioBCL();

            try
            {
                objBC.Adicionar(objUser, "empleado");

                lblMensaje.Text = "Guardado Correctamente";
                lblMensaje.Visible = true;
                lblMensaje.ForeColor = System.Drawing.Color.Blue;

            }
            catch
            {
                lblMensaje.Text = "Error de Escritura en Base de Datos";
                lblMensaje.Visible = true;
                lblMensaje.ForeColor = System.Drawing.Color.Red;

            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)///FALTA TERMINAR ESTE METODO
        {
            if (rbCliente.Checked)
            {//guardaCliente
                objEditar = new UsuarioMO();
                objEditar.User = txtUsuario.Text;
                objEditar.Contrasenia = txtNroDoc.Text;
                objEditar.Roles = "CLIENTE";
                objEditar.CodigoCliente =Int32.Parse( txtCodigo.Text);
                objEditar.Estado = "A";
                
                
                    guardarCliente(objEditar);
               
            }
            else
            {//guardaEmpleado
                                
                objEditar = new UsuarioMO();
                objEditar.User = txtUsuario.Text;
                objEditar.Contrasenia = txtNroDoc.Text;
                objEditar.CodigoEmpleado =Int32.Parse( txtCodigo.Text);
                objEditar.Estado = "A";
                
                string roles = "";
                if (chkAdmin.Checked)
                { roles += "ADMIN,CLIENTE,"; }
                if (chkStock.Checked)
                { roles += "STOCK,"; }
                if (chkVentas.Checked)
                { roles += ",VENTAS,"; }
                roles.Remove(roles.LastIndexOf(","));
                objEditar.Roles = roles;

                guardarEmpleado(objEditar);
            }
            cargaPanelBusqueda();
        }

       

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            cargaPanelCarga();
            modoVentana("nuevo");

        }

        protected void btnReset_Click(object sender, EventArgs e)
        {
            objEditar = new UsuarioMO();
            objEditar.User = txtUsuario.Text;
            objEditar.Contrasenia = txtNroDoc.Text;
            objBC.ModificarPass(objEditar);
            mensaje.Text = "Contraseña Modificada con exito";
            mensaje.Visible = true;
            cargaPanelBusqueda();
        }

        protected void gvClientes_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int ind=e.NewSelectedIndex;
            
            txtApellido.Text = gvClientes.Rows[ind].Cells[0].Text;
            txtNombre.Text = gvClientes.Rows[ind].Cells[1].Text;
            txtNroDoc.Text = gvClientes.Rows[ind].Cells[2].Text;
            txtTelefono.Text = gvClientes.DataKeys[ind].Values["Telefono"].ToString();
            ddlTipoDoc.SelectedValue = gvClientes.DataKeys[ind].Values["TipoDocumento"].ToString();
            txtCodigo.Text = gvClientes.DataKeys[ind].Values["Codigo"].ToString();
            gvClientes.Visible = false;
            PanelCliente.Visible = false;


            ControlState(this.Controls, false);

            txtUsuario.Enabled = true;
            btnGuardar.Enabled = true;
            
        }

        protected void gvEmpleados_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            int ind = e.NewSelectedIndex;

            txtApellido.Text = gvEmpleados.Rows[ind].Cells[0].Text;
            txtNombre.Text = gvEmpleados.Rows[ind].Cells[1].Text;
            txtNroDoc.Text = gvEmpleados.Rows[ind].Cells[2].Text;
          
            txtTelefono.Text = gvEmpleados.DataKeys[ind].Values["Telefono"].ToString();
            ddlTipoDoc.SelectedValue = gvEmpleados.DataKeys[ind].Values["TipoDocumento"].ToString();
            txtCodigo.Text = gvEmpleados.DataKeys[ind].Values["Codigo"].ToString();
            gvEmpleados.Visible = false;
            PanelCliente.Visible = false;
            

            ControlState(this.Controls, false);

            txtUsuario.Enabled = true;
            btnGuardar.Enabled = true;
            chkAdmin.Enabled = true;
            chkVentas.Enabled = true;
            chkStock.Enabled = true;

        }

        protected void btnVolver_Click(object sender, EventArgs e)
        {
            cargaPanelBusqueda();
        }

        

        
        
        
    }
}